package com.javacoo.swing.jxbrowser.content;

import java.awt.BorderLayout;
import java.util.logging.Level;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

import com.javacoo.swing.jxbrowser.BaseBrowser;
import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.LoadHTMLParams;
import com.teamdev.jxbrowser.chromium.LoggerProvider;
import com.teamdev.jxbrowser.chromium.WebStorage;
import com.teamdev.jxbrowser.chromium.events.LoadAdapter;
import com.teamdev.jxbrowser.chromium.events.LoadEvent;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;

/**
 * HTML5本地和会话存储
 * <li></li>
 * HTML5支持Web Storage API，允许浏览器以比使用cookie更好的方式存储键/值对。Web Storage API提供了两种在本地存储数据的机制：
 *
 *     window.localStorage存储没有过期日期的数据。
 *     window.sessionStorage存储一个会话的数据（关闭浏览器选项卡时数据会丢失）。
 *     JxBrowser提供允许使用本地和会话存储的API。请参阅以下方法：
 *     Browser.getLocalWebStorage（）返回本地Web存储实例。
 *     Browser.getSessionWebStorage（）返回Session Web存储实例。
 *     本地和会话存储实现相同的WebStorage接口，该接口提供使用存储的方法。
 *
 * 要点：如果JavaScript未访问localStorage变量，则Browser.getLocalWebStorage（）方法返回null。原因是Chromium引擎中存在本地存储的延迟初始化。您需要访问JavaScript中的localStorage变量来初始化本地存储。之后，您可以通过JxBrowser Web Storage API访问它。这是当前实施的一个限制。以下代码段演示了如何解决此限制：
 *
 * browser.addLoadListener(new LoadAdapter() {
 *     @Override
 *     public void onDocumentLoadedInMainFrame(LoadEvent event) {
 *         Browser browser = event.getBrowser();
 *         // Initialize WebStorage
 *         browser.executeJavaScript("localStorage");
 *
 *         // Access WebStorage
 *         WebStorage webStorage = browser.getLocalWebStorage();
 *         // Read and display the 'myKey' storage value.
 *         String itemValue = webStorage.getItem("myKey");
 *     }
 * });
 *
 * 以下示例演示如何访问已加载网页的本地Web存储，读取和设置键/值对
 * @author: duanyong@jccfc.com
 * @since: 2020/9/25 10:43
 */
public class HTML5LocalSessionStorages extends BaseBrowser {
    public static void main(String[] args) {
        LoggerProvider.setLevel(Level.OFF);

        Browser browser = new Browser();
        BrowserView view = new BrowserView(browser);

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(view, BorderLayout.CENTER);
        frame.setSize(800, 600);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        browser.addLoadListener(new LoadAdapter() {
            @Override
            public void onDocumentLoadedInMainFrame(LoadEvent event) {
                Browser browser = event.getBrowser();
                WebStorage webStorage = browser.getLocalWebStorage();
                // Read and display the 'myKey' storage value.
                System.out.println("The myKey value: " + webStorage.getItem("myKey"));
                // Modify the 'myKey' storage value.
                webStorage.setItem("myKey", "Hello from Local Storage");
            }
        });

        browser.loadHTML(new LoadHTMLParams(
            "<html><body><button onclick=\"myFunction()\">" +
                "Modify 'myKey' value</button>" +
                "<script>localStorage.myKey = \"Initial Value\";" +
                "function myFunction(){alert(localStorage.myKey);}" +
                "</script></body></html>",
            "UTF-8",
            "http://teamdev.com"));
    }
}
